gtk_tree_model_get_path
gtk_tree_model_get_value
gtk_tree_model_iter_next
+gtk_tree_model_iter_previous
gtk_tree_model_iter_children
gtk_tree_model_iter_has_child
gtk_tree_model_iter_n_children
gtk_tree_model_iter_next
gtk_tree_model_iter_nth_child
gtk_tree_model_iter_parent
+gtk_tree_model_iter_previous
gtk_tree_model_ref_node
gtk_tree_model_row_changed
gtk_tree_model_row_deleted
GValue *value);
static gboolean gtk_list_store_iter_next (GtkTreeModel *tree_model,
GtkTreeIter *iter);
+static gboolean gtk_list_store_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
static gboolean gtk_list_store_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent);
iface->get_path = gtk_list_store_get_path;
iface->get_value = gtk_list_store_get_value;
iface->iter_next = gtk_list_store_iter_next;
+ iface->iter_previous = gtk_list_store_iter_previous;
iface->iter_children = gtk_list_store_iter_children;
iface->iter_has_child = gtk_list_store_iter_has_child;
iface->iter_n_children = gtk_list_store_iter_n_children;
return !retval;
}
+static gboolean
+gtk_list_store_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ GtkListStore *list_store = GTK_LIST_STORE (tree_model);
+ GtkListStorePrivate *priv = list_store->priv;
+
+ g_return_val_if_fail (priv->stamp == iter->stamp, FALSE);
+
+ if (g_sequence_iter_is_begin (iter->user_data))
+ {
+ iter->stamp = 0;
+ return FALSE;
+ }
+
+ iter->user_data = g_sequence_iter_prev (iter->user_data);
+
+ return TRUE;
+}
+
static gboolean
gtk_list_store_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
return (* iface->iter_next) (tree_model, iter);
}
+static gboolean
+gtk_tree_model_iter_previous_default (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ gboolean retval;
+ GtkTreePath *path;
+
+ path = gtk_tree_model_get_path (tree_model, iter);
+ if (path == NULL)
+ return FALSE;
+
+ retval = gtk_tree_path_prev (path) &&
+ gtk_tree_model_get_iter (tree_model, iter, path);
+ if (retval == FALSE)
+ iter->stamp = 0;
+
+ gtk_tree_path_free (path);
+
+ return retval;
+}
+
+/**
+ * gtk_tree_model_iter_previous:
+ * @tree_model: a #GtkTreeModel
+ * @iter: (inout): the #GtkTreeIter
+ *
+ * Sets @iter to point to the previous node at the current level. If there
+ * is no previous @iter, %FALSE is returned and @iter is set to be invalid.
+ *
+ * Return value: %TRUE if @iter has been changed to the previous node
+ *
+ * Since: 3.0
+ */
+gboolean
+gtk_tree_model_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ gboolean retval;
+ GtkTreeModelIface *iface;
+
+ g_return_val_if_fail (GTK_IS_TREE_MODEL (tree_model), FALSE);
+ g_return_val_if_fail (iter != NULL, FALSE);
+
+ iface = GTK_TREE_MODEL_GET_IFACE (tree_model);
+
+ if (iface->iter_previous)
+ retval = (* iface->iter_previous) (tree_model, iter);
+ else
+ retval = gtk_tree_model_iter_previous_default (tree_model, iter);
+
+ return retval;
+}
+
/**
* gtk_tree_model_iter_children:
* @tree_model: A #GtkTreeModel.
GValue *value);
gboolean (* iter_next) (GtkTreeModel *tree_model,
GtkTreeIter *iter);
+ gboolean (* iter_previous) (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
gboolean (* iter_children) (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent);
GtkTreeIter *iter,
gint column,
GValue *value);
+gboolean gtk_tree_model_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
gboolean gtk_tree_model_iter_next (GtkTreeModel *tree_model,
GtkTreeIter *iter);
gboolean gtk_tree_model_iter_children (GtkTreeModel *tree_model,
GValue *value);
static gboolean gtk_tree_model_filter_iter_next (GtkTreeModel *model,
GtkTreeIter *iter);
+static gboolean gtk_tree_model_filter_iter_previous (GtkTreeModel *model,
+ GtkTreeIter *iter);
static gboolean gtk_tree_model_filter_iter_children (GtkTreeModel *model,
GtkTreeIter *iter,
GtkTreeIter *parent);
iface->get_path = gtk_tree_model_filter_get_path;
iface->get_value = gtk_tree_model_filter_get_value;
iface->iter_next = gtk_tree_model_filter_iter_next;
+ iface->iter_previous = gtk_tree_model_filter_iter_previous;
iface->iter_children = gtk_tree_model_filter_iter_children;
iface->iter_has_child = gtk_tree_model_filter_iter_has_child;
iface->iter_n_children = gtk_tree_model_filter_iter_n_children;
return FALSE;
}
+static gboolean
+gtk_tree_model_filter_iter_previous (GtkTreeModel *model,
+ GtkTreeIter *iter)
+{
+ int i;
+ FilterLevel *level;
+ FilterElt *elt;
+
+ g_return_val_if_fail (GTK_IS_TREE_MODEL_FILTER (model), FALSE);
+ g_return_val_if_fail (GTK_TREE_MODEL_FILTER (model)->priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (GTK_TREE_MODEL_FILTER (model)->priv->stamp == iter->stamp, FALSE);
+
+ level = iter->user_data;
+ elt = iter->user_data2;
+
+ i = elt - FILTER_ELT (level->array->data);
+
+ while (i > 0)
+ {
+ i--;
+ elt--;
+
+ if (elt->visible)
+ {
+ iter->user_data2 = elt;
+ return TRUE;
+ }
+ }
+
+ /* no previous visible iter */
+ iter->stamp = 0;
+
+ return FALSE;
+}
+
static gboolean
gtk_tree_model_filter_iter_children (GtkTreeModel *model,
GtkTreeIter *iter,
GValue *value);
static gboolean gtk_tree_model_sort_iter_next (GtkTreeModel *tree_model,
GtkTreeIter *iter);
+static gboolean gtk_tree_model_sort_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
static gboolean gtk_tree_model_sort_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent);
iface->get_path = gtk_tree_model_sort_get_path;
iface->get_value = gtk_tree_model_sort_get_value;
iface->iter_next = gtk_tree_model_sort_iter_next;
+ iface->iter_previous = gtk_tree_model_sort_iter_previous;
iface->iter_children = gtk_tree_model_sort_iter_children;
iface->iter_has_child = gtk_tree_model_sort_iter_has_child;
iface->iter_n_children = gtk_tree_model_sort_iter_n_children;
return TRUE;
}
+static gboolean
+gtk_tree_model_sort_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ GtkTreeModelSort *tree_model_sort = (GtkTreeModelSort *) tree_model;
+ GtkTreeModelSortPrivate *priv = tree_model_sort->priv;
+ SortLevel *level;
+ SortElt *elt;
+
+ g_return_val_if_fail (priv->child_model != NULL, FALSE);
+ g_return_val_if_fail (priv->stamp == iter->stamp, FALSE);
+
+ level = iter->user_data;
+ elt = iter->user_data2;
+
+ if (elt == (SortElt *)level->array->data)
+ {
+ iter->stamp = 0;
+ return FALSE;
+ }
+ iter->user_data2 = elt - 1;
+
+ return TRUE;
+}
+
static gboolean
gtk_tree_model_sort_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GValue *value);
static gboolean gtk_tree_store_iter_next (GtkTreeModel *tree_model,
GtkTreeIter *iter);
+static gboolean gtk_tree_store_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter);
static gboolean gtk_tree_store_iter_children (GtkTreeModel *tree_model,
GtkTreeIter *iter,
GtkTreeIter *parent);
iface->get_path = gtk_tree_store_get_path;
iface->get_value = gtk_tree_store_get_value;
iface->iter_next = gtk_tree_store_iter_next;
+ iface->iter_previous = gtk_tree_store_iter_previous;
iface->iter_children = gtk_tree_store_iter_children;
iface->iter_has_child = gtk_tree_store_iter_has_child;
iface->iter_n_children = gtk_tree_store_iter_n_children;
g_return_val_if_fail (iter->user_data != NULL, FALSE);
g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->priv->stamp, FALSE);
- if (G_NODE (iter->user_data)->next)
+ if (G_NODE (iter->user_data)->next == NULL)
{
- iter->user_data = G_NODE (iter->user_data)->next;
- return TRUE;
+ iter->stamp = 0;
+ return FALSE;
}
- else
+
+ iter->user_data = G_NODE (iter->user_data)->next;
+
+ return TRUE;
+}
+
+static gboolean
+gtk_tree_store_iter_previous (GtkTreeModel *tree_model,
+ GtkTreeIter *iter)
+{
+ g_return_val_if_fail (iter->user_data != NULL, FALSE);
+ g_return_val_if_fail (iter->stamp == GTK_TREE_STORE (tree_model)->priv->stamp, FALSE);
+
+ if (G_NODE (iter->user_data)->prev == NULL)
{
iter->stamp = 0;
return FALSE;
}
+
+ iter->user_data = G_NODE (iter->user_data)->prev;
+
+ return TRUE;
}
static gboolean
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 2));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter3, &iter_copy));
+ g_assert (iter_position (store, &iter3, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter3, &iter_copy));
+ g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 2));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter3, &iter_copy));
+ g_assert (iter_position (store, &iter3, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
/* iter invalidation */
+static void
+list_store_test_iter_previous_invalid (ListStore *fixture,
+ gconstpointer user_data)
+{
+ GtkTreeIter iter;
+
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (fixture->store),
+ &iter) == FALSE);
+ g_assert (gtk_list_store_iter_is_valid (fixture->store, &iter) == FALSE);
+ g_assert (iter.stamp == 0);
+}
+
static void
list_store_test_iter_next_invalid (ListStore *fixture,
gconstpointer user_data)
list_store_test_move_before_single);
/* iter invalidation */
+ g_test_add ("/list-store/iter-prev-invalid", ListStore, NULL,
+ list_store_setup, list_store_test_iter_previous_invalid,
+ list_store_teardown);
g_test_add ("/list-store/iter-next-invalid", ListStore, NULL,
list_store_setup, list_store_test_iter_next_invalid,
list_store_teardown);
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
g_assert (!gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 2));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter3, &iter_copy));
+ g_assert (iter_position (store, &iter3, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 0));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter3, &iter_copy));
+ g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 2));
+ g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 2));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter3, &iter_copy));
+ g_assert (iter_position (store, &iter3, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+
g_object_unref (store);
}
g_assert (gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (store), &iter_copy, NULL, 1));
g_assert (iters_equal (&iter2, &iter_copy));
+ g_assert (iter_position (store, &iter2, 1));
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
+ g_assert (iters_equal (&iter, &iter_copy));
+ g_assert (iter_position (store, &iter, 0));
+
+ g_assert (!gtk_tree_model_iter_previous (GTK_TREE_MODEL (store), &iter_copy));
g_object_unref (store);
}
/* iter invalidation */
+static void
+tree_store_test_iter_previous_invalid (TreeStore *fixture,
+ gconstpointer user_data)
+{
+ GtkTreeIter iter;
+
+ gtk_tree_model_get_iter_first (GTK_TREE_MODEL (fixture->store), &iter);
+
+ g_assert (gtk_tree_model_iter_previous (GTK_TREE_MODEL (fixture->store),
+ &iter) == FALSE);
+ g_assert (gtk_tree_store_iter_is_valid (fixture->store, &iter) == FALSE);
+ g_assert (iter.stamp == 0);
+}
+
static void
tree_store_test_iter_next_invalid (TreeStore *fixture,
gconstpointer user_data)
tree_store_test_move_before_single);
/* iter invalidation */
+ g_test_add ("/tree-store/iter-prev-invalid", TreeStore, NULL,
+ tree_store_setup, tree_store_test_iter_previous_invalid,
+ tree_store_teardown);
g_test_add ("/tree-store/iter-next-invalid", TreeStore, NULL,
tree_store_setup, tree_store_test_iter_next_invalid,
tree_store_teardown);